#include "ModuleCLUTSurvey.h"

void ModuleCLUTSurvey::init(QCVModuleHandlerInterface * parent)
{
	this->parent=parent;
	parent->setAutoProcess(false);
	win=new QWidget();
	
	pb_loadFuzzyCLUT=new QPushButton(tr("Load Fuzzy CLUT"),win);
	pb_saveResults=new QPushButton(tr("Save results"),win);
	pb_askMe=new QPushButton(tr("Get flop"),win);
	pb_clear=new QPushButton(tr("Clear results"),win);
	sb_nbColorsAsked=new QSpinBox(win);
	sb_nbColorsAsked->setPrefix(tr("nbColorsPerFlop="));
	sb_nbColorsAsked->setRange(1,25);
	sb_nbColorsAsked->setValue(4);
	
	plotcolors=new PlotColors();
	
	le_question=new QLineEdit(win);
	
	gb_flops_params=new QGroupBox(tr("Flop Parameters"),win);
	
	
	layout=new QVBoxLayout(win);
	layout->addWidget(pb_loadFuzzyCLUT);
	
	QGridLayout * glayout=new QGridLayout();
	glayout->addWidget(sb_nbColorsAsked,0,0);
	glayout->addWidget(pb_askMe,1,0);
	gb_flops_params->setLayout(glayout);
	
	layout->addWidget(gb_flops_params);
	layout->addWidget(le_question);
	layout->addWidget(plotcolors);
	QHBoxLayout * hlayout=new QHBoxLayout();
	hlayout->addWidget(pb_clear);
	hlayout->addWidget(pb_saveResults);
	layout->addLayout(hlayout);
	connect(pb_loadFuzzyCLUT,SIGNAL(clicked()),this,SLOT(s_loadFuzzyCLUT()));
	connect(pb_saveResults,SIGNAL(clicked()),this,SLOT(s_saveResults()));
	connect(pb_askMe,SIGNAL(clicked()),this,SLOT(s_askMe()));
	
	results=tr("");
	
}
////////////////////////////////////////////////////////////////////////////////
void ModuleCLUTSurvey::free()
{
	delete win;
}
////////////////////////////////////////////////////////////////////////////////
cv::Mat & ModuleCLUTSurvey::process()
{

}
////////////////////////////////////////////////////////////////////////////////
void ModuleCLUTSurvey::setInput(int n,const cv::Mat & m)
{
	
}
////////////////////////////////////////////////////////////////////////////////
QWidget* ModuleCLUTSurvey::widget()
{
	return win;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleCLUTSurvey::getName()
{
	return tr("Survey Type: Validation of FuzzyCLUT");
}
////////////////////////////////////////////////////////////////////////////////
int ModuleCLUTSurvey::nbInputs()
{
	return 1;
}
////////////////////////////////////////////////////////////////////////////////
bool ModuleCLUTSurvey::setParams(QString params)
{
	QStringList list_params=params.split(";");
		
	if(list_params.size()==1)
	{
		return true;
	}
	else
	{
		return false;
	}	
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleCLUTSurvey::getParams()
{
	return tr("no_param");
}

////////////////////////////////////////////////////////////////////////////////
QCVModuleInterface * ModuleCLUTSurvey::clone()
{
	return new ModuleCLUTSurvey;
}
////////////////////////////////////////////////////////////////////////////////
QString ModuleCLUTSurvey::help(int id)
{
	if(id==-2)
	{
		return tr("This module provide an interface to make a survey in order to valid a FuzzyCLUT");
	}
	else if(id==-1)
	{
		return tr("image");
	}
	else if(id==0)
	{
		return tr("image");
	}
	else
	{
		return tr("erreur");
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModuleCLUTSurvey::s_loadFuzzyCLUT()
{
	QString fn=QFileDialog::getOpenFileName(win,"Charger une Fuzzy CLUT","data","*.txt");
	if(!fn.isEmpty())
	{
		if(loadFuzzyCLUT(fn,fuzzyclut))
		{
			maxFuzzyCLUT_2_CLUT(fuzzyclut,clut);
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModuleCLUTSurvey::s_saveResults()
{
	QString fn=QFileDialog::getSaveFileName(win,"Charger une Fuzzy CLUT","data","*.txt");
	if(!fn.isEmpty())
	{
		QFile file(fn);
		if (file.open(QIODevice::WriteOnly | QIODevice::Text))
		{
			QTextStream out(&file);
			out << results;
			file.close();
		}
	}
}
////////////////////////////////////////////////////////////////////////////////
void ModuleCLUTSurvey::s_askMe()
{
	srand(time(0));
	QString r = plotcolors->getResults();
	if(!r.isEmpty())
	{
		results+=r;
	}

	if(!clut.empty())
	{
		//on efface le jeu de couleur precedent
		plotcolors->clearColors();
		
		//on choisi une couleur parmi les 11 possibles
		color=rand()%11;
		plotcolors->setColors(color,-1);
		
		for(int i=0;i<sb_nbColorsAsked->value();i++)
		{
			//par la methode de monte carlos on genere des couleurs appartenant au sous espace classifier comme "color"	
			uchar R,G,B;
			do
			{
				R=rand()%256;
				G=rand()%256;
				B=rand()%256;
			}
			while(CLUT(clut,R,G,B)!=color);
			
			plotcolors->addColors(QColor(R,G,B));
			
		}
		le_question->setText(tr("Which of these colors arn't ")+getC11Name(color)+tr("?"));
	}
	else
	{
		le_question->setText(tr("Oups! I need a Fuzzy CLUT please..."));
	}
	parent->adjust();
}
void ModuleCLUTSurvey::s_clearResults()
{
	results.clear();
}

////////////////////////////////////////////////////////////////////////////////
